package com.neusoft.gene.nep.role.myjwt;
import com.neusoft.gene.nep.entity.Member;
import io.jsonwebtoken.Claims;//JWT的声明，包含了token的各种属性和信息
import io.jsonwebtoken.Jwts;//WT的工具类，用于生成和解析JWT
import io.jsonwebtoken.SignatureAlgorithm;//JWT的签名算法
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: TODO
 * 基于JWT（JSON Web Token）的身份认证服务类（JwtService）
 * 用于生成和解析JWT token
 * @author: 君醉
 * @date: 2024/6/19 14:15
*/


@Service
public class JwtService {

    private    static  final  String ID ="id";
    private    static  final  String NAME ="mname";
    private static final Object ROLEID = "roleid";
    private static final String LOGID = "logid" ;
    //JWT签名的密钥。
    private  static   final  byte[] secretKey  =  "neusoft,123!neusoft,123!neusoft,123!".getBytes();



    public String generateToken(Member member) {
        Map map =new HashMap();
        //将对象中的id、roleid、mname和logid存储到一个HashMap中
        map.put(  ID , member.getId()  );
        map.put(  ROLEID , member.getRoleid()  );
        map.put(  NAME , member.getMname()  );
        map.put(  LOGID , member.getLogid()  );
        //使用Jwts.builder()构建JWT，设置主题为auth，
        // 设置声明为上面构建的HashMap，设置签发时间为当前时间，
        //设置过期时间为1小时后。
        //使用SignatureAlgorithm.HS256算法和密钥secretKey对JWT进行签名，并返回生成的token。
        return Jwts.builder()
                .setSubject("auth")
                .setClaims(map)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 3600*1000)) // 1 hour
                .signWith( SignatureAlgorithm.HS256 , secretKey )
                .compact();

    }

    //接收一个JWT token作为参数。
    public  Member parseToken(String token) {
        //使用Jwts.parserBuilder()构建JWT解析器，设置解析的签名密钥为secretKey。
        //如果Token被篡改，那么 以下语句异常
        //调用parseClaimsJws(token)方法解析token，获取其中的Claims对象。
        Claims body = Jwts.parserBuilder()
                .setSigningKey(secretKey)
                .build()
                .parseClaimsJws(token)
                .getBody();
        //根据Claims对象中存储的id、roleid、mname和logid信息，构建一个新的Member对象并返回。
            Member member = new Member();
            member.setId( (Integer) body.get(ID) );
            member.setRoleid( (Integer) body.get(ROLEID) );
            member.setMname( (String) body.get(NAME) );
            member.setLogid( (String) body.get(LOGID) );
            return member;


    }
}
